home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
Pakiet multimedia
/
Muzyka
/
Edytory sampli (probek dzwieku)
/
ZynAddSubFX_2.2.0
/
Setup_ZynAddSubFX-2.2.0.exe
/
source code
/
Synth
/
ADnote.h
< prev
next >
Wrap
C/C++ Source or Header
|
2005-03-14
|
7KB
|
259 lines
/*
ZynAddSubFX - a software synthesizer
ADnote.h - The "additive" synthesizer
Copyright (C) 2002-2005 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef AD_NOTE_H
#define AD_NOTE_H
#include "../globals.h"
#include "Envelope.h"
#include "LFO.h"
#include "../DSP/Filter.h"
#include "../Params/ADnoteParameters.h"
#include "../Params/Controller.h"
//Globals
//FM amplitude tune
#define FM_AMP_MULTIPLIER 14.71280603
#define OSCIL_SMP_EXTRA_SAMPLES 5
class ADnote{ //ADDitive note
public:
ADnote(ADnoteParameters *pars,Controller *ctl_,REALTYPE freq,REALTYPE velocity,int portamento_,int midinote_);
~ADnote();
int noteout(REALTYPE *outl,REALTYPE *outr);
void relasekey();
int finished();
/*ready - this is 0 if it is not ready (the parameters has to be computed)
or other value if the parameters has been computed and if it is ready to output*/
char ready;
private:
void setfreq(int nvoice,REALTYPE freq);
void setfreqFM(int nvoice,REALTYPE freq);
void computecurrentparameters();
void initparameters();
void KillVoice(int nvoice);
void KillNote();
inline REALTYPE getvoicebasefreq(int nvoice);
inline REALTYPE getFMvoicebasefreq(int nvoice);
inline void ComputeVoiceOscillator_LinearInterpolation(int nvoice);
inline void ComputeVoiceOscillator_CubicInterpolation(int nvoice);
inline void ComputeVoiceOscillatorMorph(int nvoice);
inline void ComputeVoiceOscillatorRingModulation(int nvoice);
inline void ComputeVoiceOscillatorFrequencyModulation(int nvoice,int FMmode);//FMmode=0 for phase modulation, 1 for Frequency modulation
// inline void ComputeVoiceOscillatorFrequencyModulation(int nvoice);
inline void ComputeVoiceOscillatorPitchModulation(int nvoice);
inline void ComputeVoiceNoise(int nvoice);
inline void fadein(REALTYPE *smps);
//GLOBALS
ADnoteParameters *partparams;
unsigned char stereo;//if the note is stereo (allows note Panning)
int midinote;
REALTYPE velocity,basefreq;
ONOFFTYPE NoteEnabled;
Controller *ctl;
/*****************************************************************/
/* GLOBAL PARAMETERS */
/*****************************************************************/
struct ADnoteGlobal{
/******************************************
* FREQUENCY GLOBAL PARAMETERS *
******************************************/
REALTYPE Detune;//cents
Envelope *FreqEnvelope;
LFO *FreqLfo;
/********************************************
* AMPLITUDE GLOBAL PARAMETERS *
********************************************/
REALTYPE Volume;// [ 0 .. 1 ]
REALTYPE Panning;// [ 0 .. 1 ]
Envelope *AmpEnvelope;
LFO *AmpLfo;
struct {
int Enabled;
REALTYPE initialvalue,dt,t;
} Punch;
/******************************************
* FILTER GLOBAL PARAMETERS *
******************************************/
Filter *GlobalFilterL,*GlobalFilterR;
REALTYPE FilterCenterPitch;//octaves
REALTYPE FilterQ;
REALTYPE FilterFreqTracking;
Envelope *FilterEnvelope;
LFO *FilterLfo;
} NoteGlobalPar;
/***********************************************************/
/* VOICE PARAMETERS */
/***********************************************************/
struct ADnoteVoice{
/* If the voice is enabled */
ONOFFTYPE Enabled;
/* Voice Type (sound/noise)*/
int noisetype;
/* Filter Bypass */
int filterbypass;
/* Delay (ticks) */
int DelayTicks;
/* Waveform of the Voice */
REALTYPE *OscilSmp;
/************************************
* FREQUENCY PARAMETERS *
************************************/
int fixedfreq;//if the frequency is fixed to 440 Hz
int fixedfreqET;//if the "fixed" frequency varies according to the note (ET)
// cents = basefreq*VoiceDetune
REALTYPE Detune,FineDetune;
Envelope *FreqEnvelope;
LFO *FreqLfo;
/***************************
* AMPLITUDE PARAMETERS *
***************************/
/* Panning 0.0=left, 0.5 - center, 1.0 = right */
REALTYPE Panning;
REALTYPE Volume;// [-1.0 .. 1.0]
Envelope *AmpEnvelope;
LFO *AmpLfo;
/*************************
* FILTER PARAMETERS *
*************************/
Filter *VoiceFilter;
REALTYPE FilterCenterPitch;/* Filter center Pitch*/
REALTYPE FilterFreqTracking;
Envelope *FilterEnvelope;
LFO *FilterLfo;
/****************************
* MODULLATOR PARAMETERS *
****************************/
FMTYPE FMEnabled;
int FMVoice;
// Voice Output used by other voices if use this as modullator
REALTYPE *VoiceOut;
/* Wave of the Voice */
REALTYPE *FMSmp;
REALTYPE FMVolume;
REALTYPE FMDetune; //in cents
Envelope *FMFreqEnvelope;
Envelope *FMAmpEnvelope;
} NoteVoicePar[NUM_VOICES];
/********************************************************/
/* INTERNAL VALUES OF THE NOTE AND OF THE VOICES */
/********************************************************/
//time from the start of the note
REALTYPE time;
//fractional part (skip)
REALTYPE oscposlo[NUM_VOICES],oscfreqlo[NUM_VOICES];
//integer part (skip)
int oscposhi[NUM_VOICES],oscfreqhi[NUM_VOICES];
//fractional part (skip) of the Modullator
REALTYPE oscposloFM[NUM_VOICES],oscfreqloFM[NUM_VOICES];
//integer part (skip) of the Modullator
unsigned short int oscposhiFM[NUM_VOICES],oscfreqhiFM[NUM_VOICES];
//used to compute and interpolate the amplitudes of voices and modullators
REALTYPE oldamplitude[NUM_VOICES],
newamplitude[NUM_VOICES],
FMoldamplitude[NUM_VOICES],
FMnewamplitude[NUM_VOICES];
//used by Frequency Modulation (for integration)
REALTYPE FMoldsmp[NUM_VOICES];
//temporary buffer
REALTYPE *tmpwave;
//Filter bypass samples
REALTYPE *bypassl,*bypassr;
//interpolate the amplitudes
REALTYPE globaloldamplitude,globalnewamplitude;
//1 - if it is the fitst tick (used to fade in the sound)
char firsttick[NUM_VOICES];
//1 if the note has portamento
int portamento;
//how the fine detunes are made bigger or smaller
REALTYPE bandwidthDetuneMultiplier;
};
#endif